# 3. Fama-French 三因子数据（使用Fama-French官方数据）
# 下载 Fama-French 三因子数据（可从肯塔基大学网站获取）
# ff_url = "https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/F-F_Research_Data_Factors_CSV.zip"
# 注意：实际使用时需处理压缩包和日期格式
# 这里简化：假设我们已下载并读取
ff_data = pd.read_csv(ff_url, skiprows=3)  # 实际需处理格式

# 由于在线读取复杂，我们使用 yfinance 近似构造 SMB 和 HML（简化版）
# 实际研究应使用官方数据

# 4. 简化三因子回归（仅演示结构）
# 假设我们已有 SMB 和 HML 数据（此处用随机数据代替，仅演示）

import yfinance as yf
import pandas as pd
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt

np.random.seed(42)
n = len(ff_data)
smb = np.random.normal(0, 0.01, n)
hml = np.random.normal(0, 0.01, n)
data['SMB'] = smb
data['HML'] = hml

X_ff = sm.add_constant(data[['market_excess', 'SMB', 'HML']])
model_ff = sm.OLS(data['excess_ret'], X_ff).fit()
print("\n=== Fama-French 三因子回归结果 ===")
print(model_ff.summary())

# 5. 比较 alpha 和 R-squared
print(f"\nCAPM Alpha: {model_capm.params['const']:.6f}, R²: {model_capm.rsquared:.4f}")
print(f"FF3F Alpha: {model_ff.params['const']:.6f}, R²: {model_ff.rsquared:.4f}")

# 可视化：实际 vs 拟合
plt.figure(figsize=(10, 6))
plt.plot(model_capm.fittedvalues, label='CAPM 拟合')
plt.plot(model_ff.fittedvalues, label='FF3F 拟合')
plt.plot(data['excess_ret'].values, label='实际超额收益', alpha=0.6)
plt.legend()
plt.title('CAPM vs Fama-French 三因子模型拟合效果')
plt.xlabel('时间')
plt.ylabel('超额收益率')
plt.show()

